package 反射;

import java.lang.reflect.Field;

/**
 * @author shy_black
 * @date 2019/3/21 15:30
 * @Description:-->借助Filed类的实例化对象完成操作
 *  * field:普通属性
 *  * 设置属性值，obj-->实例化对象，value-->要设置的值
 *  * public void set(Object obj,Object value)
 *  *
 *  * 取得属性值，obj-->实例化对象
 *  * public void get(Object obj)
 *  *
 *  *取得属性类型
 *  * public Class<?> getType()
 */
class People {
    public int age;
    private int i;
}
//属性值为public时可以操作，private或protected时无法改变或取得
public class 反射操作属性值 {
    public static void main(String[] args) throws  Exception{
        Class<People> cls = People.class;
        Field field = cls.getField("age");
        People per = cls.newInstance();

        field.set(per,18);
        field.get(per);
        System.out.println(per.age);


        //动态破坏封装,破坏后如果取消动态破坏，还是非法访问
        //只能通过反射调用
        Field field1 = cls.getDeclaredField ("i");
//        field1.setAccessible(true);

        field1.set(per,10000);
        System.out.println(field1.get(per));
    }
}
